#pragma once
#include <list>
#include <iostream>
#include <string>
#include<memory>
#include <sys/types.h>
#include <sys/socket.h>
#include<algorithm>
#include "Intaddr.hpp"
#include"log.hpp"
#include"Mutex.hpp"
using namespace LogModule;
using namespace LockModule;

//基类的析构函数定义为虚函数
//确保了通过基类指针删除派生类对象时能正确调用派生类的析构函数
class UserInterface
{
public:
    virtual ~UserInterface() = default;
    virtual void Sendto(int sockfd, const std::string message) = 0;
    virtual bool operator==(const InetAddr &u) = 0;
    virtual std::string Id() = 0;
};

//override确保此基类已经进行了重写
class User : public UserInterface
{
public:
    User(const InetAddr &id) : _id(id)
    {
    }
    //将信息发给用户自己
    virtual void Sendto(int sockfd, const std::string message) override
    {
        LOG(LogLevel::DEBUG) << "send message to " << _id.Addr() << " info: " << message;
        ssize_t num_bytes = ::sendto(sockfd, message.c_str(), message.size(), 0 , _id.NetAddr(),_id.NetAddrLen() );
        if (num_bytes < 0)
        {
            LOG(LogLevel::FATAL) << "sendto: " << strerror(errno);
            Die(SERVER_SEND_ERR);
        }
    }
    virtual bool operator==(const InetAddr &u) override
    {
        return _id == u;
    }
    virtual std::string Id() override
    {
        return _id.Addr();
    }

    ~User()
    {

    }

private:
    InetAddr _id;
};

// 对用户消息进行路由
// UserManager 把所有的用户先管理起来！
// 观察者模式！observer

//UesrManager提供服务: 新增删除用户服务  将消息发给所有人的服务
class UesrManager
{
public:
    UesrManager()
    {

    }
    //
    void Adduser(InetAddr& id)
    {
        LockGuard guard(_mutex);
        for(auto &user_ptr:_online_uesrs)
        {
            if(*user_ptr ==id)
            {//存在就返回
                LOG(LogLevel::INFO) << id.Addr() << "用户已经存在";
                return;
            }
        }
        //不存在就新增
        _online_uesrs.push_back(std::make_shared<User>(id));
        LOG(LogLevel::INFO) <<"已添加该用户" <<id.Addr() ;
        PrintUser();
    }
    void Deleuser(InetAddr& id)
    {
        //移到最后面
        auto pos = std::remove_if(_online_uesrs.begin(), _online_uesrs.end(), [&id](std::shared_ptr<UserInterface> &user){
            return *user == id;
        });
        //删除最后的元素
        _online_uesrs.erase(pos, _online_uesrs.end());
        PrintUser();
    }

    void Router(int sockfd , const std::string& message)
    {
        LockGuard guard(_mutex);
        for(auto &user_ptr :_online_uesrs)
        {
            user_ptr->Sendto(sockfd, message);
        }
    }
    void PrintUser()
    {
        for(auto user:_online_uesrs)
        {
            LOG(LogLevel::DEBUG) <<"在线用户-> "<<  user->Id();
        }
    }
    ~UesrManager()
    {
        
    }
private:
    std::list<std::shared_ptr<UserInterface>> _online_uesrs; //把所有的用户先管理起来！
    Mutex _mutex;
};